package main;

import java.awt.HeadlessException;
import java.io.FileNotFoundException;

import javax.swing.JOptionPane;

import code64.FCG;

import ast.Node;

import IOUtil.AstIOUtil;
import IOUtil.ExportacaoException;
import IOUtil.IcgIOUtil;
import IOUtil.LexicoIOUtil;
import IOUtil.ParserIOUtil;
import IOUtil.TableSymbolIOUtil;
import IOUtil.XmlIOUtil;

import parser.parser;
import ts.SymbolTable;
import lex.Lexer;

public class Main {

	public static void main(String argv[]) {

		try {
			String file = JOptionPane
					.showInputDialog("Digite o nome do arquivo: ");
			Lexer scanner = new Lexer(new java.io.FileReader(file));

			parser p = new parser(scanner);
			p.parse();
			Node root = p.getNode();

			String arquivo = file.split("\\.")[0];

			salvarLexico(scanner.strLex.toString(), arquivo);
			salvarSintatico(p.getConteudoParser(), arquivo);
			salvarTabelaSimbolo(SymbolTable.strTS.toString(), arquivo);
			if (SymbolTable.errors == 0) {
				salvarAST(root.toString(), arquivo);
				salvarXml(root.toString(), arquivo);
				root.typeCheck();
				if (SymbolTable.errors == 0) {
					root.genCode();
					salvarICG(Node.icg.toString(), arquivo);
					FCG fcg = new FCG();
					System.out.println(fcg.printListBlock());
				}
			}

		} catch (HeadlessException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (ExportacaoException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private static void salvarTabelaSimbolo(String conteudo, String arquivo)
			throws ExportacaoException {
		TableSymbolIOUtil tsfile = new TableSymbolIOUtil();
		tsfile.setCaminho(arquivo);
		tsfile.setConteudo(conteudo);
		tsfile.salvarFile();
	}

	private static void salvarSintatico(String conteudo, String arquivo)
			throws ExportacaoException {
		ParserIOUtil parserfile = new ParserIOUtil();
		parserfile.setCaminho(arquivo);
		parserfile.setConteudo(conteudo);
		parserfile.salvarFile();
	}

	private static void salvarLexico(String conteudo, String arquivo)
			throws ExportacaoException {
		LexicoIOUtil lexicofile = new LexicoIOUtil();
		lexicofile.setCaminho(arquivo);
		lexicofile.setConteudo(conteudo);
		lexicofile.salvarFile();
	}

	private static void salvarAST(String conteudo, String arquivo)
			throws ExportacaoException {
		AstIOUtil astFile = new AstIOUtil();
		astFile.setCaminho(arquivo);
		astFile.setConteudo(conteudo);
		astFile.salvarFile();
	}

	private static void salvarXml(String conteudo, String arquivo)
			throws ExportacaoException {
		XmlIOUtil xmlFile = new XmlIOUtil();
		xmlFile.setCaminho(arquivo);
		xmlFile.setConteudo(conteudo);
		xmlFile.salvarFile();
	}

	private static void salvarICG(String conteudo, String arquivo)
			throws ExportacaoException {
		IcgIOUtil icgFile = new IcgIOUtil();
		icgFile.setCaminho(arquivo);
		icgFile.setConteudo(conteudo);
		icgFile.salvarFile();
	}
}
